/*
 * @Author: 鱿鱼溪学院
 * @Date: 2025-04-15 20:52:48
 * @LastEditTime: 2025-04-17 01:27:07
 * @LastEditors: 鱿鱼溪学院
 * @Description: 用于给字符串加密解密
 * @FilePath: \yyx-web\src\utils\aes.ts
 * Copyright 鱿鱼溪学院 by edu v1.0
 * 天道酬勤
 */

import CryptoJS from 'crypto-js'

// 定义加密密钥
const key = CryptoJS.enc.Utf8.parse('1234123412ABCDEF') // 解析密钥
// 定义加密初始向量
const iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412') // 解析初始向量

/**
 * 加密方法
 * 使用AES加密算法，CBC模式，Pkcs7填充方式
 * @param word 需要加密的明文
 * @returns 返回加密后的密文，以十六进制字符串形式表示
 */
export const encrypt = (word: string) => {
  let srcs = CryptoJS.enc.Utf8.parse(word)
  const encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  })
  return encrypted.ciphertext.toString().toUpperCase()
}

/**
 * 解密方法
 * 使用AES解密算法，CBC模式，Pkcs7填充方式
 * @param word 需要解密的密文，应为十六进制字符串形式
 * @returns 返回解密后的明文
 */
export const decrypt = (word: string) => {
  //当密文以十六进制格式存储时，需先用此方法将其转为WordArray，再传递给解密函数‌。
  let encryptedHexStr = CryptoJS.enc.Hex.parse(word)

  let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr)
  const decrypt = CryptoJS.AES.decrypt(srcs, key, {
    iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  })

  let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)

  return decryptedStr.toString()
}
